#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
#include <time.h>

//队列最大容量
#define M 5

//队列
int ring[M];

//信号量
sem_t semBlank;//空资源
sem_t semData;//数据资源

//生产者
void *producer(void *arg)
{
	int i=0;
	while(1){
		//保证数据在1-100内
		int data=rand()%100+1;
		
		//生产前先P（semBlank）
		sem_wait(&semBlank);
		//生产
		ring[i]=data;
		printf("i am producer ,i product data is %d\n",data);
		//保证数组不会越界
		i++;
		i%=M;

		//生产完后，就会多一个数据资源
		sem_post(&semData);
		sleep(1);
	}
}

//消费者
void *consumer(void *arg)
{
	int i=0;
	while(1){
		//消费前先看有没有数据资源V（semData）
		sem_wait(&semData);
		//消费
		int data=ring[i];
		i++;
		i%=M;
		printf("i am consumer , a consume data is %d\n",data);
	
		//消费完，多一个空资源
		sem_post(&semBlank);
	}
}

int main()
{
	pthread_t tid1,tid2;
	srand((unsigned int)time(NULL));
	
	//初始化信号量
	sem_init(&semBlank,0,M);
	sem_init(&semData,0,0);

	//创建生产者消费者模型
	pthread_create(&tid1,NULL,producer,NULL);
	pthread_create(&tid2,NULL,consumer,NULL);
		
	//线程等待
	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);

	sem_destroy(&semBlank);
	sem_destroy(&semData);
	return 0;
}












